package com.znpc;

//import gurobi.GRB;
//import gurobi.GRBException;
//import gurobi.GRBVar;

import com.google.ortools.linearsolver.MPVariable;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * @Date 2021-09-10 11:30
 * @Author YangFan
 * @Description TODO
 */
public class ResultUtil {


    public static List<List<Integer>> getMachineOrder(MPVariable[][][] Xijk, int ordersNumber, int linesNumber) {

        List<List<Integer>> machineOrder = new ArrayList<>();

        // 产线 - 订单 - 完成时间 - 延迟时间
        for (int k = 0; k < linesNumber; k++) {
            // 找到一个在 k 产线上生产的订单，作为锚点，分别向前/向后确定该产线上的订单
            int i = 1;
            int j = 1;
            boolean find1 = false;
            for (i = 1; i < ordersNumber; i++) {
                for (j = 1; j < ordersNumber; j++) {
                    System.out.println("[i,j] = [" + i + "," + j + "] and x_ijk = " + Xijk[i][j][k].solutionValue());
                    if (Math.abs(Xijk[i][j][k].solutionValue() - 1) < 0.0000001) {
                        find1 = true;
                        break;
                    }
                }
                if (find1) break;
            }
            // 此时的 i 订单 在 j 订单前面生产
            System.out.println("[i,j] = [" + i + "," + j + "]");
            List<Integer> orders = new LinkedList<>();
            boolean allZero = false;
            // 从 i 开始向前
            orders.add(i);
            while (!allZero) {

                int l = 1;
                for (; l < ordersNumber; l++) {
                    System.out.print(l + " ");
                    if (Xijk[l][i][k].solutionValue() == 1) {
                        System.out.println("[i,j,k]==1 [" + l + "," + i + "," + k + "]");
                        orders.add(0, l);
                        i = l;
                        break;
                    }
                }
                System.out.println();
                if (l == ordersNumber) {
                    allZero = true;
                }
                System.out.println("当前产线：" + k + "订单生产列表：" + orders);
            }
            // 从 j 开始向后
            orders.add(j);
            allZero = false;
            while (!allZero) {
                int l = 1;
                for (; l < ordersNumber; l++) {
                    if (Xijk[j][l][k].solutionValue() == 1) {
                        orders.add(l);
                        j = l;
                        break;
                    }
                }
                if (l == ordersNumber) {
                    allZero = true;
                }
            }
            machineOrder.add(orders);
        }

        return machineOrder;
    }
//    public static List<List<Integer>> getMachineOrder(GRBVar[][][] Xijk, int ordersNumber, int linesNumber) throws GRBException {
//
//        List<List<Integer>> machineOrder = new ArrayList<>();
//
//        // 产线 - 订单 - 完成时间 - 延迟时间
//        for (int k = 0; k < linesNumber; k++) {
//            // 找到一个在 k 产线上生产的订单，作为锚点，分别向前/向后确定该产线上的订单
//            int i = 0;
//            int j = 0;
//            for (; i < ordersNumber; i++) {
//                for (; j < ordersNumber; j++) {
//                    if (Xijk[i][j][k].get(GRB.DoubleAttr.X) == 1) {
//                        break;
//                    }
//                }
//            }
//            // 此时的 i 订单 在 j 订单前面生产
//            List<Integer> orders = new LinkedList<>();
//            boolean allZero = false;
//            // 从 i 开始向前
//            orders.add(i);
//            while (!allZero) {
//                int l = 0;
//                for (; l < ordersNumber; l++) {
//                    if (Xijk[l][i][k].get(GRB.DoubleAttr.X) == 1) {
//                        orders.add(0, l);
//                        i = l;
//                        break;
//                    }
//                }
//                if (l == ordersNumber) {
//                    allZero = true;
//                }
//            }
//            // 从 j 开始向后
//            orders.add(j);
//            allZero = false;
//            while (!allZero) {
//                int l = 0;
//                for (; l < ordersNumber; l++) {
//                    if (Xijk[j][l][k].get(GRB.DoubleAttr.X) == 1) {
//                        orders.add(l);
//                        j = l;
//                        break;
//                    }
//                }
//                if (l == ordersNumber) {
//                    allZero = true;
//                }
//            }
//        }
//
//        return machineOrder;
//    }
}
